package com.kapcb.assemble.filter;

/**
 * <a>Title: Filter </a>
 * <a>Author: Kapcb <a>
 * <a>Description: Filter <a>
 *
 * @author Kapcb
 * @version 1.0
 * @date 2024/4/18 20:56
 * @since 1.0
 */
public interface Filter<T extends FilterRequest, R extends FilterResponse> {

    /**
     * 过滤器的执行顺序，越小越先执行
     *
     * @return int
     */
    int order();

    /**
     * 过滤器的类型
     *
     * @return String
     */
    String type();

    /**
     * 当前过滤器是否执行
     *
     * @param request  入参
     * @param response 出参
     * @return true 执行、false 不执行
     */
    default boolean skip(T request, R response) {
        return true;
    }

    /**
     * 执行过滤器
     *
     * @param request     入参
     * @param response    出参
     * @param filterChain 过滤链
     */
    void doFilter(T request, R response, FilterChain<T, R> filterChain);

}
